package jp.co.dailyReport.staff.action;

import java.io.IOException;
import java.util.Calendar;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import jp.co.dailyReport.DataUnavailableException;
import jp.co.dailyReport.staff.Staff;
import jp.co.dailyReport.staff.StaffManager;
import jp.co.dailyReport.PermissionException;

/**
 * 社員情報編集ページのボタン（戻る、更新）
 * が押されたときの処理を管理するクラスです。
 */
public class StaffEditAction extends Action {

	private static Logger log = Logger.getLogger(StaffEditAction.class);

	/**
	 * 社員情報編集ページで押されるボタン（戻る、更新）
	 * によって、実行する処理を制御します。<BR><BR>
	 * 「戻る」ボタンが押された場合の処理：<BR>
	 * 社員情報をDBから取得します。<BR><BR>
	 * 「更新」ボタンが押された場合の処理：<BR>
	 * 入力チェックを行い、社員情報をDBから更新します。
	 * 社員IDから取引先情報を取得します。<BR>
	 * 
	 * @param mapping このインスタンスを選択するために使用したActionMapping
	 * @param form 存在するならば、このリクエストのためのActionForm Bean
	 * @param request 処理しているHTTPリクエスト
	 * @param response 処理しているHTTPレスポンス
	 * @return ActionForwardインスタンス
	 * @throws IOException, ServletException
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
	 throws IOException, ServletException {

		log.debug("StaffEditAction start");
		ActionErrors errors = new ActionErrors();
		String target = null;

		if(request.getParameter("edit") != null) {
			target = "edit";
			staffEdit(form, request, errors);
		} else if(request.getParameter("returnList") != null) {
			target = "returnList";
			staffReturnList(form, request, errors);
		}
		if (!errors.isEmpty()){
			saveErrors(request,errors);
		}

		log.debug("StaffEditAction end");
		return mapping.findForward(target);
	}

	private void staffEdit(ActionForm form, HttpServletRequest request, ActionErrors errors) {

		HttpSession session = request.getSession();
		log.debug("session.getId() = " + session.getId());
		Staff staff = (Staff)session.getAttribute("LoginStaff");
		if (request.getParameter("name") == null || request.getParameter("name").length() == 0){
			errors.add("name",new ActionError("errors.name.required"));
		}
		if (request.getParameter("usr") == null || request.getParameter("usr").length() == 0){
			errors.add("usr",new ActionError("errors.usr.required"));
		}
		if (request.getParameter("passwd") == null || request.getParameter("passwd").length() == 0){
			errors.add("passwd",new ActionError("errors.passwd.required"));
		}
		//既に存在するﾕｰｻﾞを入力した時のﾁｪｯｸ
		try {
			StaffActionForm staffActionForm = (StaffActionForm)form;
			Staff staffEdit = new Staff();
			staffEdit.setStaffId(staffActionForm.getStaffId());
			staffEdit.setName(staffActionForm.getName());
			if(!StaffManager.load(staffActionForm.getStaffId()).getUsr().equals(staffActionForm.getUsr())) {
				if(StaffManager.isExist(request.getParameter("usr"))) {
					errors.add("usr",new ActionError("errors.usr.isExist"));
				}else{
					staffEdit.setUsr(staffActionForm.getUsr());
				}
			}else{
				staffEdit.setUsr(staffActionForm.getUsr());
			}
			staffEdit.setKeyCode(StaffManager.encryptedPassword(staffActionForm.getPasswd()));
			staffEdit.setEmploymentSystem(staffActionForm.getEmploymentSystem());
			staffEdit.setPosition(staffActionForm.getPosition());
			if (errors.isEmpty()){
				StaffManager.update(staff,staffEdit);
				java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy/MM/dd");
				Calendar cal = Calendar.getInstance();
				String result = df.format(cal.getTime());
				log.debug("update staff date: " + result + " staffId: " + staffActionForm.getStaffId() + " password: " + staffActionForm.getPasswd() + " keyCode: " + StaffManager.encryptedPassword(staffActionForm.getPasswd()));
			}
			staffEdit = StaffManager.load(staffEdit.getStaffId());
			staffActionForm.setStaffId(staffEdit.getStaffId());
			staffActionForm.setName(staffEdit.getName());
			staffActionForm.setUsr(staffEdit.getUsr());
			staffActionForm.setPasswd("");
			staffActionForm.setEmploymentSystem(staffEdit.getEmploymentSystem());
			staffActionForm.setPosition(staffEdit.getPosition());
		} catch(PermissionException pe) {
			log.error(pe.getMessage());
		} catch(DataUnavailableException due) {
			log.error(due.getMessage());
		}
	}

	private void staffReturnList(ActionForm form, HttpServletRequest request, ActionErrors errors) {

		HttpSession session = request.getSession();
		Staff staff = (Staff)session.getAttribute("LoginStaff");
		StaffActionForm staffActionForm = (StaffActionForm)form;
		Staff staffList[] = (Staff[])null;
		staffActionForm.setStaffId(staff.getStaffId());
		try {
			staffList = StaffManager.load(staff);
		} catch(DataUnavailableException due) {
			log.error(due.getMessage());
		} catch(PermissionException pe) {
			log.error(pe.getMessage());
		}
		request.setAttribute("staffList", staffList);
	}
}
